package br.com.translog.dao;

import br.com.translog.interfacee.IDAOValidacao;
import br.com.translog.modelo.Bairro;
import br.com.translog.modelo.Cidade;
import br.com.translog.modelo.Estado;
import br.com.translog.modelo.Funcionario;
import br.com.translog.modelo.GrupoAcesso;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

public class DAOValidacao implements IDAOValidacao {
    
    private static EntityManagerFactory emf = Persistence.createEntityManagerFactory("TranslogPU");

    private static EntityManager getEntityManager() {
        
        return emf.createEntityManager();
    }

    @Override
    public Bairro validaBairro(String nomeBairro) {
        
        //Chamando o metodo que retornara o Factory junte com a criacao do EntityManager...
        EntityManager em = getEntityManager();
        Bairro bairro;
        
        try {
            bairro  = (Bairro) em.createNamedQuery("Bairro.findByNome")
                    .setParameter("nome", nomeBairro)
                    .getSingleResult();
        } catch (Exception e) {
            return null;
        } finally {
            //Fechando o EntityManager para liberar conexoes...
            em.close();
        }
 
        return bairro;
    }

    @Override
    public Cidade validaCidade(String nomeCidade) {
        
        //Chamando o metodo que retornara o Factory junte com a criacao do EntityManager...
        EntityManager em = getEntityManager();
        Cidade cidade;
        
        try {
            cidade = (Cidade) em.createNamedQuery("Cidade.findByNome")
                    .setParameter("nome", nomeCidade)
                    .getSingleResult();
        } catch (Exception e) {
            return null;
        } finally {
            //Fechando o EntityManager para liberar conexoes...
            em.close();
        }
        
        return cidade;
    }

    @Override
    public Estado validaEstado(String nomeEstado) {
        
        //Chamando o metodo que retornara o Factory junte com a criacao do EntityManager...
        EntityManager em = getEntityManager();
        Estado estado;
        
        try {
            estado = (Estado) em.createNamedQuery("Estado.findByNome")
                    .setParameter("nome", nomeEstado)
                    .getSingleResult();
        } catch (Exception e) {
            return null;
        } finally {
            //Fechando o EntityManager para liberar conexoes...
            em.close();
        }
        
        return estado;
    }
    
    @Override
    public GrupoAcesso validaGrupoAcesso(String nomeGrupoAcesso) {
        
        //Chamando o metodo que retornara o Factory junte com a criacao do EntityManager...
        EntityManager em = getEntityManager();
        GrupoAcesso grupoAcesso;
        
        try {
            grupoAcesso = (GrupoAcesso) em.createNamedQuery("GrupoAcesso.findByDescricao")
                    .setParameter("descricao", nomeGrupoAcesso)
                    .getSingleResult();
        } catch (Exception e) {
            return null;
        } finally {
            //Fechando o EntityManager para liberar conexoes...
            em.close();
        }
        
        return grupoAcesso;
    }

    @Override
    public boolean validaLogin(int matricula, String senha) {
        
        //Chamando o metodo que retornara o Factory junte com a criacao do EntityManager...
        EntityManager em = getEntityManager();
        boolean existeFuncionario = false;
        Funcionario funcionario;
        
        try {
            funcionario = (Funcionario) em.createNamedQuery("Funcionario.findByMatriculaAndSenha")
                    .setParameter("matricula", matricula)
                    .setParameter("senha", senha)
                    .getSingleResult();
            
            if (funcionario != null) {
                existeFuncionario = true;
            }
            
        } finally {
            //Fechando o EntityManager para liberar conexoes...
            em.close();
        }
        
        return existeFuncionario;
    }
}
